/*
 * fh_crypto_api.c
 *
 *  Created on: Dec 6, 2016
 *      Author: duobao
 */


#include "fh_crypto_api.h"
#include "fh_unf_cesa.h"





int32_t FH_CRYPTO_Init(void)
{
	return FH_UNF_CESA_Open();
}

int32_t FH_CRYPTO_DeInit(void)
{	
	return FH_UNF_CESA_Close();
}

int32_t FH_CRYPTO_CreateHandle(CRYPTO_HANDLE *phCipher)
{
	return FH_UNF_CESA_ADES_Create(phCipher);
}

int32_t FH_CRYPTO_DestroyHandle(CRYPTO_HANDLE hCipher)
{
	return FH_UNF_CESA_ADES_Destroy(hCipher);
}

int32_t FH_CRYPTO_ConfigHandle(CRYPTO_HANDLE hCipher, CRYPTO_CTRL_S* pstCtrl)
{
	FH_CESA_ADES_CTRL_S ctrl;

	switch(pstCtrl->enAlg)
	{
	case CRYPTO_ALG_AES:		
		switch(pstCtrl->enKeyLen)
		{
		case CRYPTO_KEY_AES_128BIT:
			ctrl.algo_mode = FH_CESA_ADES_ALGO_MODE_AES128;
			break;
		case CRYPTO_KEY_AES_192BIT:
			ctrl.algo_mode = FH_CESA_ADES_ALGO_MODE_AES192;
			break;
		case CRYPTO_KEY_AES_256BIT:
			ctrl.algo_mode = FH_CESA_ADES_ALGO_MODE_AES256;
			break;
		default:
			break;
		}
		break;
	case CRYPTO_ALG_DES:
		ctrl.algo_mode = FH_CESA_ADES_ALGO_MODE_DES;
		break;
	case CRYPTO_ALG_3DES:
		ctrl.algo_mode = FH_CESA_ADES_ALGO_MODE_TDES;
		break;
	default:
		break;
	}

	switch(pstCtrl->enWorkMode)
	{
	case CRYPTO_WORK_MODE_ECB:
		ctrl.work_mode = FH_CESA_ADES_WORK_MODE_ECB;
		break;
	case CRYPTO_WORK_MODE_CBC:
		ctrl.work_mode = FH_CESA_ADES_WORK_MODE_CBC;
		break;
	case CRYPTO_WORK_MODE_CFB:
		ctrl.work_mode = FH_CESA_ADES_WORK_MODE_CFB8;
		break;
	case CRYPTO_WORK_MODE_OFB:
		ctrl.work_mode = FH_CESA_ADES_WORK_MODE_OFB;
		break;
	case CRYPTO_WORK_MODE_CTR:
		ctrl.work_mode = FH_CESA_AES_WORK_MODE_CTR;
		break;
	default:
		break;
	}

	switch (pstCtrl->enKeySrc)
	{
	case CRYPTO_KEY_SRC_USER:
		ctrl.enKeySrc = FH_CESA_ADES_KEY_SRC_USER;
		break;
	case CRYPTO_KEY_SRC_EFUSE:
		ctrl.enKeySrc = FH_CESA_ADES_KEY_SRC_EFUSE;
		break;
	default:
		break;
	}

	ctrl.oper_mode = FH_CESA_ADES_OPER_MODE_ENCRYPT;

	memcpy(ctrl.key, pstCtrl->u32Key, 32);
	memcpy(ctrl.iv, pstCtrl->u32IV, 16);

	return FH_UNF_CESA_ADES_Config(hCipher, &ctrl);
}

int32_t FH_CRYPTO_Encrypt(CRYPTO_HANDLE hCipher, uint32_t u32SrcPhyAddr,
		uint32_t u32DestPhyAddr, uint32_t u32ByteLength)
{
	return FH_UNF_CESA_ADES_Encrypt(hCipher, u32SrcPhyAddr, u32DestPhyAddr, u32ByteLength);
}

int32_t FH_CRYPTO_Decrypt(CRYPTO_HANDLE hCipher, uint32_t u32SrcPhyAddr,
		uint32_t u32DestPhyAddr, uint32_t u32ByteLength)
{	
	return FH_UNF_CESA_ADES_Decrypt(hCipher, u32SrcPhyAddr, u32DestPhyAddr, u32ByteLength);
}

int32_t FH_CRYPTO_Mapswitch(CRYPTO_HANDLE hCipher, uint32_t *u32MapBuf, uint32_t u32MapBufSize)
{
	return FH_UNF_CESA_ADES_Efuse_Key(hCipher, u32MapBuf, u32MapBufSize);
}

int32_t FH_CRYPTO_AddrAttr(CRYPTO_HANDLE hCipher,
				CRYPTO_ADDR_ATTR_E eSrcAddrAttr,
				CRYPTO_ADDR_ATTR_E eDstAddrAttr)
{
	return FH_UNF_CESA_ADES_Addr_Attr(hCipher, eSrcAddrAttr, eDstAddrAttr);
}

